/* 
 * File:   ThreadRdidCard.cpp
 * Author: batista
 * 
 * Created on 17 de Março de 2013, 17:44
 */

#include "ThreadRFIDCard.h"
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>

ThreadRFIDCard::ThreadRFIDCard() : JoinableThread() {
    //    
    timet = new TimeUtil();
    //
    ShowMessage("Construtor(): ThreadRdidCard()!!", COLOR_BLUE, COLOR_PINK);
}

ThreadRFIDCard::~ThreadRFIDCard() {
}

void ThreadRFIDCard::run() {

    ::sleep(4);
    //
    ShowMessage("INICIANDO (ThreadRdidCard())....!!!" + std::string(wardIPPds), COLOR_BLUE, COLOR_PINK);
    //
    //string str_ip = wardIPPds;

    while (1) {
        ShowMessage("INICIANDO O PROCESSO DE CAPTURA....!!!", COLOR_BLUE, COLOR_PINK);
        //Aguarda 1000 milessimo de segundo
        timet->SleepSeg(1000);
        //
        RunCapCards();
        //Executa teste de Captura
        //TestCap();
    }
}

/**
 * Metodo Principalde 
 * captura dos dados
 * para os cartoes
 */
void ThreadRFIDCard::RunCapCards() {
    std::string msg, reply, hexacard;

    timet->SleepSeg(100);
    // 
    if (pinghost(wardIPPds)) {
        //
        msg = "[  Pds200 Esta Ativo!!! ] IP: " + std::string(wardIPPds) + " Hora: " + timet->getTime();
        //
        ShowMessage(msg, COLOR_BLUE, COLOR_GREEN);
        //
        //Pasta onde serar gravado o arquivo
        dirfl->setFolder_write("/Logs/Card/Socket/");
        //        
        dirfl->CreateLogFile("SOCKET-LOG-CONNECTION-OK", msg);
        //
        try {
            //
            ClientSocket client_socket(wardIPPds, 1001);

            while (1) {
                try {
                    //client_socket << "Test message.";
                    ShowMessage("[ AGUARDANDO DADOS NO SOCKET!! ]", COLOR_BLUE, COLOR_PINK);
                    //
                    //Recebendo dados do socket
                    client_socket >> reply;
                    //
                    cout << FG_BLUE << " --> " << FG_GREEN << reply << END << endl;
                    //
                    //Passa os dados capturados 
                    hexacard.append(reply);
                    //
                    if (hexacard.size() == 11) {
                        card = new Card();
                        //
                        ShowMessage("Dados Recebidos.....: " + hexacard, COLOR_BLUE, COLOR_CIANO);

                        //Seta o hexa capturado                           
                        card->SetHexa_Card(hexacard);

                        //Seta ala de captura
                        card->SetWardPds(wardIPPds);

                        //Seta a hora da captura
                        card->SetDate_Time_Called(timet->getTime());

                        //Adiciona para a base de dados
                        dbconn->runAddHexaCardInSqLite(card);
                        //
                        msg = "---------------------------------------------------\n"
                                "\nDados Capturados:\n"
                                "\nAla.........: " + card->GetWardPds() +
                                "\nCartão......: " + hexacard +
                                "\nData e Hora.: " + card->GetDate_Time_Called() +
                                "\n-----------------------------------------------\n";
                        //Gera um arquivo com os dados capturados
                        //Pasta onde serar gravado o arquivo
                        dirfl->setFolder_write("/Logs/Card/Cap/");
                        //
                        dirfl->CreateLogFile("PDS200-LOG-CAP-OK", msg);
                        //
                        hexacard.clear();
                        reply.clear();
                    }

                    /**
                     * Entra aqui caso tenha problema 
                     * com os dados de captura.
                     */
                    if (hexacard.size() > 11) {
                        while (1) {
                            //Recebendo dados do socket
                            client_socket >> reply;
                            //
                            if (timet->containsChar(reply.c_str(), '@')) {
                                reply.clear(); //limpa 
                                hexacard.clear(); //limpa 
                                break;
                            }
                        }
                    }

                } catch (SocketException& e) {
                    msg = "\nErro na Captura:\n " + std::string(e.description()) + " IP: " + std::string(wardIPPds) + " Hora: " + timet->getTime() + "\n";
                    //
                    ShowMessage(msg, COLOR_BLUE, COLOR_RED);
                    //
                    // dirfl->CreateLogFile("SOCKET-LOG-CAP-ERRO", msg);
                    //
                    break;
                }
            }

        } catch (SocketException& e) {
            msg = "\nErro Socket: " + std::string(e.description()) + " IP: " + std::string(wardIPPds) + " Hora: " + timet->getTime() + "\n";
            //
            ShowMessage(msg, COLOR_BLUE, COLOR_RED);
            //
            // dirfl->CreateLogFile("SOCKET-LOG-CAP-ERRO", msg);
            //
            timet->SleepSeg(1000);
        }
    } else {
        //
        msg = "[  Pds200 Nao esta Ativo!!!  ] IP: " + std::string(wardIPPds) + " Hora:" + timet->getTime();
        //
        ShowMessage(msg, COLOR_BLUE, COLOR_RED);
        //
        //Pasta onde serar gravado o arquivo
        dirfl->setFolder_write("/Logs/Card/Socket/");
        //
        dirfl->CreateLogFile("SOCKET-LOG-CONNECTION-ERRO", msg);
        //
        timet->SleepSeg(1000);
    }

}

/**
 * Metodo para teste de captura
 */
void ThreadRFIDCard::TestCap() {


    std::string str_ip = "192.168.1.200";

    if (pinghost(str_ip.c_str())) {
        //
        cout << "Esta Ativo!!!" << endl;
        //
        try {

            ClientSocket client_socket(str_ip.c_str(), 1001);

            std::string reply;
            while (1) {
                try {
                    //client_socket << "Test message.";
                    cout << " Waiting!!! " << endl;
                    client_socket >> reply;
                    cout << "Receive --> " << reply.c_str() << endl;
                    reply.clear();

                } catch (SocketException& e) {
                    cout << " Erro Socket!!! " << e.description() << endl;
                    break;
                }
            }

        } catch (SocketException& e) {
            std::cout << "Exception was caught:" << e.description() << "\n";
        }
    } else {
        //
        cout << "Nao esta Ativo!!!" << endl;
        //
    }
    using namespace UCOMMON_NAMESPACE;
}